﻿using Kanban.Entity;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace Kanban.Repository
{
    public class TarefaRepository : RepositoryBase
    {
        public void Adicionar(Tarefa tarefa)
        {
            var parametros = new Dictionary<string, object>();
            parametros.Add("Descricao", tarefa.Descricao);
            parametros.Add("CriadoPor", tarefa.CriadaPor.Id);
            parametros.Add("IdQuadro", tarefa.Quadro.Id);
            if (tarefa.Tipo > 0)
            {
                parametros.Add("Tipo", tarefa.Tipo);
            }

            int id = Convert.ToInt32(this.Adicionar<Tarefa>(parametros));

            tarefa.Id = id;
        }

        //public void AtualizarDescricao(Tarefa tarefa)
        //{
        //    var parametros = new Dictionary<string, object>();            
        //    parametros.Add("Descricao", tarefa.Descricao);
        //    this.Atualizar<Tarefa>(tarefa.Id, parametros);
        //}

        public void Atualizar(Tarefa tarefa)
        {
            var parametros = new Dictionary<string, object>();
            if (!string.IsNullOrEmpty(tarefa.Descricao))
            {
                parametros.Add("Descricao", tarefa.Descricao);
            }

            if (tarefa.Status > 0)
            {
                parametros.Add("Status", tarefa.Status);
            }

            if (tarefa.Tipo > 0)
            {
                parametros.Add("Tipo", tarefa.Tipo);
            }
            
            if (tarefa.Responsavel != null)
            {
                // Se o Id for igual a zero, queremos deixar sem uma pessoa responsável
                if (tarefa.Responsavel.Id == 0)
                {
                    parametros.Add("Responsavel", null);
                }
                else
                {
                    parametros.Add("Responsavel", tarefa.Responsavel.Id);
                }
            }

            this.Atualizar<Tarefa>(tarefa.Id, parametros);
        }

        public List<Tarefa> ListarTarefasPendentesPorUsuario(string usuario)
        {
            string sql = @"DECLARE @IdUsuario INT
                           SELECT @IdUsuario = Id FROM [PREFIXO_TABELA]Usuario WHERE Nome = @Nome


                            select t.Id, t.Descricao, t.IdQuadro, q.Nome, t.Status, 
                            ISNULL(c.Nome,
	                             CASE WHEN t.[Status] = 1 THEN 'To do'
	                             WHEN t.[Status] = 2 THEN 'Doing'
	                             ELSE 'Done' END) as [Status],
                            t.Tipo as Cor
                            from [PREFIXO_TABELA]Tarefa t
                            inner join [PREFIXO_TABELA]Quadro q
                            on q.Id = t.IdQuadro
                            left join [PREFIXO_TABELA]QuadroColuna c
                            on c.Ordem = t.[Status] and c.IdQuadro = t.IdQuadro
                            WHERE t.Responsavel = @IdUsuario and t.Excluido = 0 AND t.Arquivado = 0  AND q.Excluido = 0 AND q.Arquivado = 0
                            AND t.[Status] < ISNULL((SELECT MAX(c.Ordem) FROM [PREFIXO_TABELA]QuadroColuna c WHERE c.IdQuadro = t.IdQuadro), 3)";

            var parametros = new Dictionary<string, object>();
            parametros.Add("Nome", usuario);

            return this.Listar<Tarefa>(sql, parametros, this.PopularTarefaPendente);
        }

        public List<Tarefa> ListarPorIdQuadro(int idQuadro)
        {
            string sql = @"SELECT t.Id, t.IdQuadro, t.Status, t.Descricao, t.Arquivado, t.CriadoPor, t.Responsavel, t.DataCadastro, t.Excluido, r.Nome, t.Tipo
                           FROM [PREFIXO_TABELA]Tarefa t LEFT JOIN [PREFIXO_TABELA]Usuario r ON r.Id = t.Responsavel  WHERE IdQuadro = @IdQuadro AND t.Excluido = 0 ORDER BY t.DataCadastro";
            var parametros = new Dictionary<string, object>();
            parametros.Add("IdQuadro", idQuadro);

            return this.Listar<Tarefa>(sql, parametros, this.PopularObjeto);
        }

        public Tarefa ObterPorId(int id)
        {
            var parametros = new Dictionary<string, object>();
            parametros.Add("Id", id);

            return this.Obter<Tarefa>("SELECT t.Id, t.IdQuadro, t.Status, t.Descricao, t.Arquivado, t.CriadoPor, r.Id, t.DataCadastro, t.Excluido, r.Nome, t.Tipo FROM [PREFIXO_TABELA]Tarefa t LEFT JOIN [PREFIXO_TABELA]Usuario r ON r.Id = t.Responsavel WHERE t.Id = @Id", parametros, this.PopularObjeto);
        }

        public void Remover(int id)
        {
            this.RemoverLogicamente<Tarefa>(id);
        }

        private Tarefa PopularTarefaPendente(SqlDataReader reader)
        {
            var tarefa = new Tarefa();
            tarefa.Id = reader.GetInt32(0);
            tarefa.Descricao = reader.GetString(1);
            tarefa.Quadro = new Quadro();
            tarefa.Quadro.Id = reader.GetInt32(2);
            tarefa.Quadro.Nome = reader.GetString(3);
            tarefa.Status = reader.GetInt32(4);
            tarefa.DescricaoStatus = reader.GetString(5);
            tarefa.Tipo = reader.GetInt32(6);

            return tarefa;
        }

        private Tarefa PopularObjeto(SqlDataReader reader)
        {
            var tarefa = new Tarefa();
            tarefa.Id = reader.GetInt32(0);
            tarefa.Quadro = new Quadro();
            tarefa.Quadro.Id = reader.GetInt32(1);
            tarefa.Status = reader.GetInt32(2);
            tarefa.Descricao = reader.GetString(3);
            tarefa.Arquivado = reader.GetBoolean(4);
            tarefa.CriadaPor = new Usuario();
            tarefa.CriadaPor.Id = reader.GetInt32(5);
            if (!reader.IsDBNull(6))
            {
                tarefa.Responsavel = new Usuario();
                tarefa.Responsavel.Id = reader.GetInt32(6);

                if (reader.FieldCount > 9)
                {
                    tarefa.Responsavel.Nome = reader.GetString(9);
                }
            }
            tarefa.DataCadastro = reader.GetDateTime(7);
            if (reader.FieldCount > 10)
            {
                tarefa.Tipo = reader.GetInt32(10);
            }

            return tarefa;
        }

        public List<Tarefa> ListarPorChaveQuadro(string chave)
        {
            string sql = @"SELECT t.Id, t.IdQuadro, t.Status, t.Descricao, t.Arquivado, t.CriadoPor, t.Responsavel, t.DataCadastro, t.Excluido, r.Nome, t.Tipo
                           FROM [PREFIXO_TABELA]Tarefa t INNER JOIN [PREFIXO_TABELA]Quadro q ON q.Id = t.IdQuadro LEFT JOIN [PREFIXO_TABELA]Usuario r ON r.Id = t.Responsavel  WHERE Chave = @Chave AND t.Excluido = 0  ORDER BY t.DataCadastro";
            var parametros = new Dictionary<string, object>();
            parametros.Add("Chave", chave);

            return this.Listar<Tarefa>(sql, parametros, this.PopularObjeto);
        }

        public Tarefa Obter(int id, string chaveQuadro)
        {
            var parametros = new Dictionary<string, object>();
            parametros.Add("Id", id);
            parametros.Add("ChaveQuadro", chaveQuadro);

            return this.Obter<Tarefa>("SELECT t.Id, t.IdQuadro, t.Status, t.Descricao, t.Arquivado, t.CriadoPor, r.Id, t.DataCadastro, t.Excluido, r.Nome, t.Tipo FROM [PREFIXO_TABELA]Tarefa t INNER JOIN [PREFIXO_TABELA]Quadro q ON q.Id = t.IdQuadro LEFT JOIN [PREFIXO_TABELA]Usuario r ON r.Id = t.Responsavel WHERE t.Id = @Id AND q.Chave = @ChaveQuadro", parametros, this.PopularObjeto);
        }
    }
}
